using System;
using System.Data;
using System.Configuration;
using System.ComponentModel;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

namespace Dimok.Web.UI {

	////////////////////////////////////////////////////////////////////////////////////////////////////
	/// <summary>	Drop down list ex. </summary>
	///
	/// <remarks>	Dimon, 12/21/2010. </remarks>
	////////////////////////////////////////////////////////////////////////////////////////////////////

	public class DropDownListEx : DropDownList {

		////////////////////////////////////////////////////////////////////////////////////////////////////
		/// <summary>	Values that represent ErrorModeType. </summary>
		///
		/// <remarks>	Dimon, 12/21/2010. </remarks>
		////////////////////////////////////////////////////////////////////////////////////////////////////

		public enum ErrorModeType { Silent, First, Last, SelectFirst, SelectLast }
		private ErrorModeType _errorMode = ErrorModeType.Silent;

		////////////////////////////////////////////////////////////////////////////////////////////////////
		/// <summary>	Gets or sets the error mode. </summary>
		///
		/// <value>	The error mode. </value>
		////////////////////////////////////////////////////////////////////////////////////////////////////

		[Bindable(true)]
		public ErrorModeType ErrorMode { get { return _errorMode; } set { _errorMode = value; } }

		string _dataTextDefault = null;

		////////////////////////////////////////////////////////////////////////////////////////////////////
		/// <summary>	Gets or sets the data text default. </summary>
		///
		/// <value>	The data text default. </value>
		////////////////////////////////////////////////////////////////////////////////////////////////////

		public string DataTextDefault { get { return _dataTextDefault; } set { _dataTextDefault = value; } }
		string _dataValueDefault = null;

		////////////////////////////////////////////////////////////////////////////////////////////////////
		/// <summary>	Gets or sets the data value default. </summary>
		///
		/// <value>	The data value default. </value>
		////////////////////////////////////////////////////////////////////////////////////////////////////

		public string DataValueDefault { get { return _dataValueDefault; } set { _dataValueDefault = value; } }

		////////////////////////////////////////////////////////////////////////////////////////////////////
		/// <summary>	Default constructor. </summary>
		///
		/// <remarks>	Dimon, 12/21/2010. </remarks>
		////////////////////////////////////////////////////////////////////////////////////////////////////

		public DropDownListEx() { }

		////////////////////////////////////////////////////////////////////////////////////////////////////
		/// <summary>	Raises the pre render event. </summary>
		///
		/// <remarks>	Dimon, 12/21/2010. </remarks>
		///
		/// <param name="e">	Event information to send to registered event handlers. </param>
		////////////////////////////////////////////////////////////////////////////////////////////////////

		protected override void OnPreRender(EventArgs e) {
			base.OnPreRender(e);
			if(DataValueDefault != null) Items.Insert(0, new ListItem(DataTextDefault, DataValueDefault));
		}

		////////////////////////////////////////////////////////////////////////////////////////////////////
		/// <summary>	Perform data binding. </summary>
		///
		/// <remarks>	Dimon, 12/21/2010. </remarks>
		///
		/// <param name="dataSource">	The data source. </param>
		////////////////////////////////////////////////////////////////////////////////////////////////////

		protected override void PerformDataBinding(System.Collections.IEnumerable dataSource) {
			try {
				base.PerformDataBinding(dataSource);
				return;
			} catch(ArgumentOutOfRangeException) {
			} catch(InvalidOperationException) {}
			switch( ErrorMode ){
				case ErrorModeType.Silent: return;
				case ErrorModeType.First:
					Items.Insert(0, DataTextDefault+ "");
					break;
				case ErrorModeType.Last:
					Items.Add("");
					break;
				case ErrorModeType.SelectFirst:
					SelectedIndex = 0;
					break;
				case ErrorModeType.SelectLast:
					SelectedIndex = Items.Count-1;
					break;
			}
			SelectedValue = "";
		}
	}
}